package MyIODemo;


import java.io.*;
import java.util.Scanner;





/**
 * 基本版本的写入文件
 */
class StreamTest2 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("./demo.txt")) {
            byte[] buffer = {97,98,99};
            outputStream.write(buffer);

        }catch (IOException e){
            e.printStackTrace();

        }
    }
}



/**
 * 基本版本的读入文件
 */
public class StreamTest {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./demo.txt")){
            while(true) {
                byte[] buffer = new byte[1024];
                int flg = inputStream.read(buffer);
                if(flg == -1) {
                    break;
                }

                for (int i = 0; i < flg; i++) {
                    System.out.print((char) buffer[i]);
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


/**
 *
 * 利用 scanner 读入到scanner 中
 * 利用 scanner 来输出
 *
 */


class  StreamTest3 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./demo.txt")) {
            Scanner in = new Scanner(inputStream);

            while(in.hasNext()) {
                System.out.println(in.next());
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}


/**
 * 查找指定文件并且删除
 *
 */


class StreamTest4 {
    public static void main(String[] args) {
        // 确定路径
        System.out.print("请输入指定路径: ");
        Scanner in = new Scanner(System.in);
        String path = in.next();

        // 转化成路径
        File  pathRoot = new File(path);

//        判断是否是合法路径
        if(!pathRoot.isDirectory()) {
            System.out.println("不是合法路径！");
            return;
        }

        // 输入指定文件
        System.out.print("请输入指定的文件的关键字: ");
        String key = in.next();

        // 进行递归
        scan(pathRoot, key);
    }

    private static void scan(File pathRoot, String key) {
        // 判断当前路径是否合法
        if(!pathRoot.isDirectory()) {
            return;
        }

        // 合法的情况下取出当前所以的路径
        File[] files = pathRoot.getAbsoluteFile().listFiles();


        // 多加一层判断
        if (files== null || files.length == 0) {
            return;
        }

        // 深度优先遍历 所以的文件路径
        for(File file : files) {
            if(file.isFile()) {
//                是文件的话就开始判断是不是指定文件
//                然后进行删除
                delete(file, key);

            } else {
                // 继续往下递归
                scan(file,key);
            }
        }

    }

    private static void  delete(File file, String key) {
        if(file.getName().contains(key)) {
            System.out.println("请确定是否删除该文件:" + file.getAbsoluteFile() + " Y/y -> 是, N/n -> 否 :  ");
            Scanner in = new Scanner(System.in);
            String  str = in.next();

            if(str.equals("y") || str.equals("Y")) {
                file.delete();
                System.out.println("删除成功！");
            } else {
                System.out.println("删除失败,正在退出...");

            }
        }
    }

}


/**
 *
 * 将一个文件拷贝到另外一个文件
 *
 */


class StreamTest5 {

    public static void main(String[] args) {
        System.out.print("请输入源文件路径: ");
        Scanner in = new Scanner(System.in);
        String path = in.next();
        File curPath = new File(path);

        // 判断是否合法路径
        // 是否是正确的文件
        if(!curPath.isFile()) {
            System.out.println("源文件非法!");
            return;

        }


        // 判断是否合法
        System.out.print("请输入目标文件的路径: ");
         path = in.next();
         File descPath = new File(path);
         if (!curPath.getParentFile().isDirectory()) {
             System.out.println("目标文件路径非法");
            return;
         }

         // 开始进行读入 和写出
        try (InputStream inputStream = new FileInputStream(curPath) ;
        OutputStream outputStream = new FileOutputStream(descPath)) {
            byte[] buffer = new byte[1024];
            // 从源文件读入, 写出到目标文件
            while(true) {

//               读入
               int n = inputStream.read(buffer);
               if(n==-1) {
                   break;
               }

               // 写出
               outputStream.write(buffer,0,n);
            }

            System.out.println("拷贝成功! ");

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}


/**
 *
 * 从文件内容的角度获取该文件的路径
 *
 */


class StreamTest6 {
    public static void main(String[] args) {
        // 获取路径
        System.out.print("请输入目标文件的路径: ");
        Scanner in = new Scanner(System.in);
        String path = in.next();
        File curPath = new File(path);

        // 判断路径是否合法
        if(curPath.getParentFile().isFile()) {
            System.out.println("路径不合法");
            return;
        }

//        输入查找内容
        System.out.print("请输入要查找的内容: ");
        String key = in.next();

        // 开始深搜
        scanSearch(curPath , key);

    }

    private  static  void  scanSearch (File file , String key) {
        if(!file.isDirectory()) {
            return;
        }

        // 得到每一个路径
        File[] files = file.getAbsoluteFile().listFiles();

        if(files == null || files.length == 0) {
            return;
        }

        // 开始遍历每一个路径
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
                search(files[i], key);
            } else {
                scanSearch(files[i],key);
            }

        }
    }

    // 查找
    private static  void  search (File file , String key) {

        // 用一个 StrBuilder  来存储字符内容
        StringBuilder stringBuilder = new StringBuilder();

        // 先提取每一个内容
        try(InputStream inputStream  = new  FileInputStream(file)) {
            // 用一个byte 来承装
            byte[] buffer = new byte[1024];



            while(true) {

//                长度
                int n = inputStream.read(buffer);
                if(n== -1) {
                    break;
                }

                // 循环转换字符 加入到字符串中
//                for (int i = 0; i < n; i++) {
//                    stringBuilder.append((char)buffer[i]);
//                }

                // 转换字符串
                String str = new String(buffer , 0 , n);
                stringBuilder.append(str);
            }




        } catch(IOException e) {
            e.printStackTrace();
        }

        // 第一种： 字符串包含
        if (stringBuilder.toString().contains(key)) {
            System.out.println(file.getAbsoluteFile());

        }

        // 第二种： 下标包含
        if (stringBuilder.indexOf(key)!= -1) {
            System.out.println(file.getAbsoluteFile());
        }

    }
}
